package com.genreate.util.pay.wx.enums;

import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * 微信支付接口错误码枚举类
 * 包含HTTP状态码、错误码、错误描述及解决方案
 */
@Getter
public enum WxPayErrorCodeEnum {

    // ====================== 公共错误码 ======================
    // 400错误
    PARAM_ERROR(400, "PARAM_ERROR", "参数错误", "请根据错误提示正确传入参数"),
    INVALID_REQUEST_COMMON(400, "INVALID_REQUEST", "HTTP 请求不符合微信支付 APIv3 接口规则", "请参阅 接口规则检查传入的参数"),

    // 401错误
    SIGN_ERROR_COMMON(401, "SIGN_ERROR", "验证不通过", "请参阅 签名常见问题排查"),

    // 500错误
    SYSTEM_ERROR_COMMON(500, "SYSTEM_ERROR", "系统异常，请稍后重试", "请稍后重试"),

    // ====================== 业务错误码 ======================
    // 400错误
    APPID_MCHID_NOT_MATCH(400, "APPID_MCHID_NOT_MATCH", "AppID和mch_id不匹配", "请确认AppID和mch_id是否匹配，查询指引参考：查询商户号绑定的APPID"),
    INVALID_REQUEST_BUSINESS(400, "INVALID_REQUEST", "无效请求", "请根据接口返回的详细信息检查"),
    MCH_NOT_EXISTS(400, "MCH_NOT_EXISTS", "商户号不存在", "请检查商户号是否正确，商户号获取方式请参考：普通商户模式开发必要参数说明"),
    PARAM_ERROR_BUSINESS(400, "PARAM_ERROR", "参数错误", "请根据接口返回的错误描述检查参数，参数需按API文档字段填写说明填写"),

    // 401错误
    SIGN_ERROR_BUSINESS(401, "SIGN_ERROR", "签名错误", "请检查签名参数和方法是否都符合签名算法要求，参考：如何生成签名"),

    // 403错误
    NO_AUTH(403, "NO_AUTH", "商户无权限", "请商户前往商户平台申请此接口相关权限，参考：权限申请"),
    OUT_TRADE_NO_USED(403, "OUT_TRADE_NO_USED", "商户订单号重复", "请核实商户订单号是否重复提交"),

    // 429错误
    FREQUENCY_LIMITED(429, "FREQUENCY_LIMITED", "频率超限", "请求频率超限，请降低请求接口频率"),

    // 500错误
    SYSTEM_ERROR_BUSINESS(500, "SYSTEM_ERROR", "系统错误", "系统异常，请用相同参数重新调用");


    /**
     * 哈希表缓存：key=错误码，value=枚举实例
     */
    private static final Map<String, WxPayErrorCodeEnum> CODE_MAP = new HashMap<>();

    static {
        for (WxPayErrorCodeEnum errorCodeEnum : values()) {
            CODE_MAP.put(errorCodeEnum.code, errorCodeEnum);
        }
    }

    /**
     * HTTP状态码
     */
    private final int httpStatusCode;

    /**
     * 错误码
     */
    private final String code;

    /**
     * 错误描述
     */
    private final String msg;

    /**
     * 解决方案
     */
    private final String solution;

    WxPayErrorCodeEnum(int httpStatusCode, String code, String msg, String solution) {
        this.httpStatusCode = httpStatusCode;
        this.code = code;
        this.msg = msg;
        this.solution = solution;
    }

    /**
     * 根据错误码获取枚举实例（忽略HTTP状态码，用于快速匹配）
     *
     * @param code 错误码
     * @return 匹配的枚举实例，无匹配时返回null
     */
    public static WxPayErrorCodeEnum getByCode(String code) {
        return CODE_MAP.get(code);
    }

    /**
     * 根据错误码获取错误消息
     *
     * @param code 错误码
     * @return 错误描述信息，无匹配时返回null
     */
    public static String getMsgByCode(String code) {
        WxPayErrorCodeEnum errorCodeEnum = getByCode(code);
        if (errorCodeEnum != null) {
            return errorCodeEnum.msg;
        }
        return null;
    }

    /**
     * 根据错误码获取解决方案
     *
     * @param code 错误码
     * @return 解决方案，无匹配时返回null
     */
    public static String getSolutionByCode(String code) {
        WxPayErrorCodeEnum errorCodeEnum = getByCode(code);
        if (errorCodeEnum != null) {
            return errorCodeEnum.solution;
        }
        return null;
    }
}